package http

import (
	"forum/app/gateway/rpc"
	pb "forum/idl/pb/post"
	"forum/pkg/ctl"
	"github.com/gin-gonic/gin"
	"net/http"
)

// PostCreate 创建帖子
func PostCreate(ctx *gin.Context) {
	var postReq pb.PostRequest
	if err := ctx.ShouldBind(&postReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	postReq.UserID = user.Id
	r, err := rpc.PostCreate(ctx, &postReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "PostCreate RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}

// PostDelete 删除帖子
func PostDelete(ctx *gin.Context) {
	var postReq pb.PostRequest
	if err := ctx.ShouldBind(&postReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	postReq.UserID = user.Id
	r, err := rpc.PostDelete(ctx, &postReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "PostDelete RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}

// PostUpdate 更新帖子
func PostUpdate(ctx *gin.Context) {
	var postReq pb.PostRequest
	if err := ctx.ShouldBind(&postReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	postReq.UserID = user.Id
	r, err := rpc.PostUpdate(ctx, &postReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "PostUpdate RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}

// PostShow 获取用户所有帖子
func PostShow(ctx *gin.Context) {
	var postReq pb.PostRequest
	if err := ctx.ShouldBind(&postReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	postReq.UserID = user.Id
	r, err := rpc.PostShow(ctx, &postReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "PostShow RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}

// PostShowOne 获取指定帖子
func PostShowOne(ctx *gin.Context) {
	var postReq pb.PostRequest
	if err := ctx.ShouldBind(&postReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	postReq.UserID = user.Id
	r, err := rpc.PostShowOne(ctx, &postReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "PostShowOne RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}
